package com.ityang.hhhh.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ityang.hhhh.conm.CustomExcept;
import com.ityang.hhhh.conm.R;
import com.ityang.hhhh.domain.User;
import com.ityang.hhhh.service.UserService;
import com.ityang.hhhh.utils.MailUtils;
import com.ityang.hhhh.utils.QiniuUtils;
import com.ityang.hhhh.utils.ValidateCodeUtils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpRequest;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 用户
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private RedisTemplate redisTemplate;

   /* @Autowired
    private MailUtils mailUtils;*/


    /**
     * 手机端用户登录
     * @param user
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody User user){
        // 1、将页面提交的密码password进行md5加密处理
        String password = user.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        // 2、根据页面提交的用户名username查询数据库
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.eq(User::getUsername, user.getUsername());
        User u = userService.getOne(lqw);

        //3、如果没有查询到则返回登录失败结果
        try{
        if (u.getUsername() == null){
            return R.error("用户名不存在");
        }}catch (Exception e){
            e.printStackTrace();
            return R.error("用户名不存在");
        }

        //4、密码比对，如果不一致则返回登录失败结果
        if (!u.getPassword().equals(password)){
            return R.error("密码错误");
        }

        //5、查看员工状态，如果为已禁用状态0，则返回员工已禁用结果
        if (u.getStatus() == 0){
            return R.error("账号已禁用");
        }
        // 6、登录成功，将员工id存入Redis并返回登录成功结果
        //request.getSession().setAttribute("employee",u.getId());
        redisTemplate.opsForValue().set("user",user.getId());
        return R.success(u);
    }

    /**
     * 用户注册
     * @param user
     * @return
     */
    @PostMapping("/register")
    public R register(@RequestBody User user) {
        try {
            user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
            String username = user.getUsername();
            LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
            userLambdaQueryWrapper.eq(User::getUsername,username);
            List<User> list = userService.list(userLambdaQueryWrapper);
            if (list.size() >0){
                return R.error("用户名已存在");
            }
            userService.save(user);
            return R.success("注册成功");

        } catch (Exception e) {
            return R.error("注册失败");
        }
    }

    /**
     * 退出功能
     *
     * @return
     */
    @PostMapping("/logout")
    public R<String> logout(){
        //redisTemplate.opsForSet().remove("user");
        redisTemplate.delete("user");
        return R.success("退出成功");
    }

    /**
     * 修改密码
     * @param map
     * @return
     */
    @PutMapping("/updateByPassword")
    public R updateByPassword(@RequestBody Map map){
        try{

            userService.updateByIdPass(map);
        }catch (Exception e){
            e.printStackTrace();
            return R.error("修改失败");
        }
        return R.success("修改成功");
    }

    /**
     * 根据邮箱发送验证码
     * @param user
     * @return
     */
    @PostMapping("/sendEmile")
    public R sendEmile(@RequestBody User user){
        //获取邮箱
        String email = user.getEmail();
        Long userId = user.getId();
        //判断邮箱是否正确
        User user1 = userService.getById(userId);
        if (user1 == null){
            //用户名有误
            return R.error("用户名错误");
        }
        if (!user1.getEmail().equals(email)){
            //邮箱错误
            return R.error("邮箱输入有误");
        }
        //生成验证码
        Integer code = ValidateCodeUtils.generateValidateCode(6);
        //发送验证码
        MailUtils mailUtils = new MailUtils();
        mailUtils.send(code.toString(),email);
        //将验证码存入Redis
        redisTemplate.opsForValue().set(email,code);
        return R.success("发送成功");
    }

    /**
     * 修改用户信息
     * @param user
     * @return
     */
    @PutMapping("/updateById")
    public R updateById(@RequestBody User user){
        try{
            userService.updateById( user);
            return R.success("修改成功！");
        }catch (Exception e){
            e.printStackTrace();
            return R.error("修改失败");
        }

    }

    /**
     * 视频文件上传
     * @param imgFile
     * @return
     */
    @PostMapping("/upload")
    public R upload(MultipartFile imgFile){
        String originalFilename = imgFile.getOriginalFilename();//原始文件名
        int index = originalFilename.lastIndexOf(".");//取出"."包含点之后的文件名 .jpg
        String substring = originalFilename.substring(index);//取出"."包含点之后的文件名 .jpg
        String fileName = UUID.randomUUID().toString() + substring;//使用uuid生成文件名

        try {
            //使用七牛云存储视频
            QiniuUtils.upload2Qiniu(imgFile.getBytes(),fileName);
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("上传失败");
        }
        return R.success("上传成功");

    }

}
